from socket import *
import multiprocessing
import time
import struct

class socket_Server:
    def __init__(self) -> None:
        self.c = 0              #计时器
    def Server(self):
        '''服务端'''
        #创建进程池
        pools = multiprocessing.get_context("spawn")
        #pool = pools.Pool(processes=self.thd) 指定进程数量,我这里不指定
        pool = pools.Pool()
        s = socket(AF_INET,SOCK_STREAM)                 #ipv4
        myip = gethostbyname(gethostname())             #获取自身ip
        s.bind((gethostname(),1200))                    #获取自身名称并绑定, 1200为端口号
        s.listen(100)                                     #允许多少设备连接
        print('服务已打开')
        while True:
            self.cs,self.address = s.accept()                         #建立连接
             # 分配进程任务
            result = pool.apply_async(self.task)                      #异步执行
            #print(result.get())          #获取任务结果
            #print(result.ready())         #检查任务是否已经完成
            #print(result.successful())     #检查任务是否成功执行
    def task(self):
        #分配进程任务
        #关闭进程池,等待所有任务完成
        try:
            self.clientHostname = gethostbyaddr(self.address[0])[0]   #获取到连接设备的名称
            print(self.clientHostname)
            time.sleep(1)
        except:pass                                     #解析不了就不解析了
        total_data = b""
        data = self.cs.recv(20000)               #收到数据
        total_data+=data
        c = 0
        while len(data)>0:
            print(c)
            data = self.cs.recv(20000)               #收到数据
            total_data+=data
            c+=1
        with open("C:\\Users\\x6985\\Desktop\\3D\\11.zip","wb") as f:
            f.write(total_data)                 #将文件写入
        # print('服务端收到的消息{}'.format(message))
        self.cs.send('我已经收到'.encode('utf-8'))
        self.cs.close()                                     #释放资源
        
def Client(ips,files):
    '''客户端,可传入多参数'''
    host_name = ips
    port_num = 1200
    clientSocket = socket(AF_INET,SOCK_STREAM)   #ipv4
    clientSocket.connect((host_name,port_num))   #连接的地址与端口号
    with open(files, 'rb') as f: 
        # 从文件中读取数据到缓冲区
        bin = f.read(1024*10240)
        s = len(bin)
        clientSocket.sendall(bin)
        print(s)
        while bin:
            # 处理缓冲区中的数据
            # 从文件中读取下一块数据到缓冲区
            bin = f.read(1024*10240)#buffering=1024*1024表示将缓冲区的大小设置为1MB
            s+=len(bin)
            clientSocket.sendall(bin)
            print(s)
    start_time = time.time()
    # message = "hello"
    print('发送完毕')
    # server_return = clientSocket.recv(1024).decode() #接收服务端返回值
    # print(server_return)
    clientSocket.close()                         #释放内存
    end_time = time.time()
    Elapsed_time = (end_time-start_time)//60     #运行时间
    print(Elapsed_time)



if __name__ == "__main__":
    s1 = socket_Server()
    s1.Server()
    